package svpo;

//Importações necessárias
import Validation.*;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.RandomAccessFile;
import java.text.ParseException;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**<b> Classe que Cadastra os Usuários.</b>
 *
 * @author Gustavo C.
 * @author Rodrigo M.
 */
public class CadastraUser {
    /**Gerando o objeto de log**/
    private static Logger log = Logger.getLogger(CadastraUser.class.getName());

    /** Criando variáveis que armazenarão os dados do usuário. */
    private String nome, cpf, endereco, telefone, telefonePais, telefoneRegiao, email, senha;
    private String nascimento;
    /** Criando Arquivo que armazenará os dados. */
    private static RandomAccessFile arquivo;
    private String nomeArq = "user.txt";

    /** <b> Método set para o nome.
     * @param nome Nome do usuário para armazenamento.</b>*/
    public void setNome(String nomein) {

        ValidaSimples valida = new ValidaSimples();
        Validacoes v = new Validacoes();
            
        if (v.validaNome(nomein) == 1) {
            this.nome = nomein;
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("NOME SETADO COM SUCESSO."));

        } else {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("NOME INCORRETO!"), "ERROR", JOptionPane.ERROR_MESSAGE);

            this.nome = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("NOME INCORRETO."));
        }

    }

    /** <b> Método set para o CPF, com tratamento de erros.
    @param cpf CPF de entrada para armazenamento.</b>
     */
    public void setCpf(String cpfin) {
        try {
            Cpf c = new Cpf(cpfin);
            if (c.ValidaCpf()) {
                this.cpf = cpfin;
                log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CPF SETADO COM SUCESSO."));

            } else {
                JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CPF INVÁLIDO!"), java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ERROR"), JOptionPane.ERROR_MESSAGE);
                this.cpf = null;
                log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CPF INVÁLIDO."));

            }
        } catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ERRO CPF :DIGITE APENAS CARACTERS NUMÉRICOS ") + ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            this.cpf = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CPF COM CARACTERES NÃO NUMÉICOS."));
        } catch (StringIndexOutOfBoundsException e) {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ERRO CPF: ") + e.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            this.cpf = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CPF MUITO GRANDE."));
        }

    }

    /** <b> Método set para o endereço.
     * @param endereço Senha do usuário para armazenamento.</b>*/
    public void setEndereco(String enderecoin) {
        Validacoes v = new Validacoes();
        ValidaSimples valida = new ValidaSimples();

        if (v.validaNome(enderecoin) == 1) {
            this.endereco = enderecoin;
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ENDEREÇO SETADO COM SUCESSO."));

        } else {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ENDEREÇO INCORRETO!"), "ERROR", JOptionPane.ERROR_MESSAGE);

            this.endereco = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CPF INCORRETO."));

        }

    }

    /** <b> Método set para o telefone.
     * @param telefone Número de telefone para armazenamento.</b>
     */
    public void setTelefone(String telefonein) {
        ValidaSimples valida = new ValidaSimples();

        if (valida.validaTelefone(telefonein) == 1) {
            this.telefone = telefonein;
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("TELEFONE SETADO COM SUCESSO."));

        } else {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("TELEFONE INCORRETO!"), "ERROR", JOptionPane.ERROR_MESSAGE);
            this.telefone = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("TELEFONE INVÁLIDO."));

        }
    }

    /** <b> Método set para o DDI.
     * @param telefonePais DDI para armazenamento.</b>
     */
    public void setTelefonePais(String telefonePaisin) {
        ValidaSimples valida = new ValidaSimples();

        if (valida.validaDDD(telefonePaisin) == 1) {
            this.telefonePais = telefonePaisin;
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DDI SETADO COM SUCESSO."));

        } else {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DDI INCORRETO!"), "ERROR", JOptionPane.ERROR_MESSAGE);
            this.telefonePais = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DDI INVÁLIDO."));


        }
    }

    /** <b> Método set para o DDD.
     * @param telefoneRegiao DDD para armazenamento. </b>
     */
    public void setTelefoneRegiao(String telefoneRegiaoin) {
        ValidaSimples valida = new ValidaSimples();

        if (valida.validaDDD(telefoneRegiaoin) == 1) {
            this.telefoneRegiao = telefoneRegiaoin;
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DDD SETADO COM SUCESSO."));

        } else {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DDD INCORRETO!"), "ERROR", JOptionPane.ERROR_MESSAGE);
            this.telefoneRegiao = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DDD INVÁLIDO."));

        }
    }

    /** <b> Método set para o email.
     * @param email Email do usuário para armazenamento.</b>*/
    public void setEmail(String emailin) {

        ValidaSimples valida = new ValidaSimples();

        if (valida.validaEmail(emailin) == 1) {
            this.email = emailin;
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("EMAIL SETADO COM SUCESSO."));

        } else {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("EMAIL FORA DOS PADRÕES!"), "ERROR", JOptionPane.ERROR_MESSAGE);
            this.email = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("EMAIL FORA DOS PADRÕES."));

        }

    }

    /** <b> Método set para o senha.
     * @param senha Senha do usuário para armazenamento.</b>*/
    public void setSenha(String senhain) {

        ValidaSimples valida = new ValidaSimples();

        if (valida.validaSenha(senhain) == 1) {
            this.senha = senhain;
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("SENHA SETADA COM SUCESSO."));

        } else {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("POR FAVOR , DIGITE UMA SENHA NÃO-NULA"), "ERROR", JOptionPane.ERROR_MESSAGE);
            this.senha = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("SENHA NULA."));

        }

    }

    /** <b> Método set para a data, com tratamento de erros. 
    @param nascimento Data de nascimento para armazenamento.</b>*/
    public void setNascimento(String dataNascimentoin) {

        try {
            if (Data.validarData(dataNascimentoin)) {
                this.nascimento = dataNascimentoin;
                log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DATA SETADA COM SUCESSO."));
            } else {
                JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DATA INVÁLIDO"), "ERROR", JOptionPane.ERROR_MESSAGE);
                this.nascimento = null;
                log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DATA INVÁLIDA."));
            }
        } catch (ParseException ex) {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DIGITE UMA DATA NO FORMATO (DD/MM/YYYY)") + ex.getMessage(), "ERROR", JOptionPane.ERROR_MESSAGE);
            this.nascimento = null;
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DATA FORA DO FORMATO."));
        }

    }

    /** <b> Método para retorno do CPF.
     *   @return String - cpf - Retorna o CPF do usuário.</b>
     */
    public String getCpf() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CPF RETORNADO."));
        return cpf;       
    }

    /** <b> Método para retorno da data.
     *   @return String - dataNascimento - Retorna a data de nascimetno do usuário.</b>
     */
    public String getNascimento() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("NASCIMENTO RETORNADO."));
        return nascimento;
    }

    /** <b> Método para retorno do nome.
     *   @return String - nome - Retorna o nome do usuário.</b>
     */
    public String getNome() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("NOME RETORNADO."));
        return nome;
    }

    /** <b> Método para retorno do telefone.
     *   @return String - telefone - Retorna o telefone do usuário.</b>
     */
    public String getTelefone() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("TELEFONE RETORNADO."));
        return telefone;
    }

    /** <b> Método para retorno do DDI.
     *   @return String - telefonePais - Retorna o DDI do usuário.</b>
     */
    public String getTelefonePais() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DDI RETORNADO."));
        return telefonePais;
    }

    /** <b> Método para retorno do DDD.
     *   @return String - telefoneRegiao - Retorna o DDD do usuário.</b>
     */
    public String getTelefoneRegiao() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("DDD RETORNADO."));
        return telefoneRegiao;
    }

    /** <b> Método para retorno do Endereço.
     *   @return String - endereco - Retorna o Endereço do usuário.</b>
     */
    public String getEndereco() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ENDEREÇO RETORNADO."));
        return endereco;
    }

    /** <b> Método para retorno do Email.
     *   @return String - email - Retorna o Email do usuário.</b>
     */
    public String getEmail() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("EMAIL RETORNADO."));
        return email;
    }

    /** <b> Método para retorno da Senha.
     *   @return String - senha - Retorna a Senha  do usuário.</b>
     */
    public String getSenha() {
        log.info(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("SENHA RETORNADA."));
        return senha;
    }
    /** <b> Método de cadastro. </b> */
    public void salvar(){

    if (getCpf()!= null && getEmail() != null && getNome() != null && getTelefonePais() != null && getTelefoneRegiao() != null 
                    && getTelefone() != null && getNascimento() != null && getSenha() != null && getEndereco() != null) 

     {
        try {
            arquivo = new RandomAccessFile(new File(nomeArq), java.util.ResourceBundle.getBundle("svpo/Bundle").getString("RW"));
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ARQUIVO ABERTO COM SUCESSO"));
        } catch (FileNotFoundException e) {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ARQUIVO INEXISTENTE"), java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ERROR"), JOptionPane.ERROR_MESSAGE);
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ARQUIVO INEXISTENTE!"));
        }

        try {
            
            arquivo.seek(arquivo.length());

            arquivo.writeBytes(nome + "\n");
            arquivo.writeBytes(cpf + "\n");
            arquivo.writeBytes(endereco + "\n");            
            arquivo.writeBytes(telefoneRegiao + "\n");
            arquivo.writeBytes(telefonePais + "\n");
            arquivo.writeBytes(telefone + "\n");
            arquivo.writeBytes(email + "\n");
            arquivo.writeBytes(senha + "\n");
            arquivo.writeBytes(nascimento + "\n");           

            arquivo.seek(0);
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CADASTRO EFETUADO COM SUCESSO!"), "", JOptionPane.INFORMATION_MESSAGE);
            log.fine(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("CADASTRO EFETUADO COM SUCESSO"));

        } catch (IOException e) {
            JOptionPane.showMessageDialog(null, java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ERRO AO ESCREVER NO ARQUIVO"), "ERROR", JOptionPane.ERROR_MESSAGE);
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ERRO AO ESCREVER NO ARQUIVO"));
        }

        
    }else{
        log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ALGUM DOS VALORES DE CADASTRO É NULO!!"));
    }

}
     /** ==============================================================================
     * Objetivo : Conta o numero de linhas de um arquivo
     * @param arq
     * @param num
     * @return numero de linhas
     * @autor RODRIGO
      ==============================================================================*/
    public int Nlinhas (String arq, int num){
        int linhas=0;
        try {
            File arquivoLeitura = new File(arq);

            // pega o tamanho
            long tamanhoArquivo = arquivoLeitura .length();
            FileInputStream fs = new FileInputStream(arquivoLeitura);
            DataInputStream in = new DataInputStream(fs);


            LineNumberReader lineRead = new LineNumberReader(new InputStreamReader(in));
            lineRead.skip(tamanhoArquivo);
            // conta o numero de linhas do arquivo, come�ando com zero, por isso adiciona 1
            linhas = lineRead.getLineNumber() + 1;


        } catch (IOException e) {
        System.out.println(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ARQUIVO INEXISTENTE"));
        
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ARQUIVO INEXISTENTE"));
        return 0;
        }
        if(linhas!=0) {
            linhas = ((linhas-1)/num);
        }
        return linhas;
    }
    /**==============================================================================
         * Salva Verifica Existência de Usuario no arquivo
         * @param String cpf
          
         *@return posicao - existe; 0 - n existe;    
         * @author RODRIGO
     ==============================================================================*/
   public int VerificaUsuario(String cpf){
      
     
       
         int aux1=0;
         //Declaracao do objeto "RandomAccessFile" (arquivo que ser� manipulado)
        try {
            arquivo = new RandomAccessFile(new File(nomeArq),"r");
        }
        catch (FileNotFoundException e) {
        //No caso do arquivo nao existir
        System.out.println(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ARQUIVO INEXISTENTE"));
        log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ARQUIVO INEXISTENTE"));
        aux1=-1;
        return 0;
        }
        if(aux1==0){
            try {
                int aux2=0;
                do{

                    setNome(arquivo.readLine());
                    setCpf(arquivo.readLine());
                    setEndereco(arquivo.readLine());
                    setTelefoneRegiao(arquivo.readLine());
                    setTelefonePais(arquivo.readLine());
                    setTelefone(arquivo.readLine());
                    setEmail(arquivo.readLine());
                    setSenha(arquivo.readLine());
                    setNascimento(arquivo.readLine());
                    
                   
                    aux2++;
                    if(    getCpf() == null ? cpf == null : getCpf().equals(cpf)){
                    	return 1;
                        
                         
                    }
                }while((aux2 < Nlinhas (nomeArq, 9)));
            }
            catch (IOException e) {
            //No caso de um erro ao ler do arquivo
            System.out.println(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ERRO LENDO DO ARQUIVO"));
            log.severe(java.util.ResourceBundle.getBundle("svpo/Bundle").getString("ERRO AO LER ARQUIVO"));
            return 0;
            }
            
        }
        return 0;
         
     }
}
